package com.hscm.boss.job.task;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.EasyExcel;
import com.hscm.boss.common.utils.NoUtil;
import com.hscm.boss.common.utils.mails.MailClient;
import com.hscm.boss.common.utils.mails.model.AttachFile;
import com.hscm.boss.common.utils.mails.model.MailProperties;
import com.hscm.boss.dao.entity.UserInfo;
import com.hscm.boss.dao.mapper.TradeOrderMapper;
import com.hscm.boss.dao.result.EachDayBillOrder;
import com.hscm.boss.job.task.header.EachDayHeader;
import com.xxl.job.core.handler.annotation.XxlJob;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ThreadPoolExecutor;

/*创建定时任务   对于时间的控制是在调度中心*/
@Component
public class TaskService {
    @XxlJob("myFirstJob")//方法的标示值
    public void testJob() {
        System.out.println("====定时任务开始执行====");
    }

    @Value("${bill.path}")  //日对账单文件路径  （使用easyExcel）
    private String billPath;

    @Resource
    private TradeOrderMapper tradeOrderMapper;

    @Resource
    private ThreadPoolExecutor threadPoolExecutor;

    @Value("${spring.mail.username}")  //是mail.yml文件的username
    private String mainFrom;

    @Resource
    private MailClient mailClient;

    //生成每日对账单 , 方法执行的前一天
    @XxlJob("generateEachDayBill")  //定时任务
    public void generateEachDayBill() {
        //1 获取有支付成功的记录的用户列表
        Date current = new Date();
        //offset 中第一个参数是时间  第二个参数是要操作时间的部分 第三个参数是做加做减的数量值
        Date yesterday = DateUtil.offset(current, DateField.DAY_OF_MONTH, -1);

        //截断
        Date beginDate = DateUtil.truncate(yesterday, DateField.DAY_OF_MONTH);
        Date endDate = DateUtil.truncate(current, DateField.DAY_OF_MONTH);


        //一个日期一个文件夹，存放这一天的所有的商家的对账单excel文件
        //格式化日期
        String dateFormat = new SimpleDateFormat("yyyyMMdd").format(yesterday);
        //创建文件夹路径 path 代表创建的路径的名字
        Path path = Paths.get(billPath, dateFormat);

        try {
            if (!Files.exists(path)) {//判断路径是否存在
                //createDirectories（复数形式）能创建多级路径
                //创建路径是IO操作 会有异常
                Files.createDirectories(path);
            }
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }


        List<String> userNoList = tradeOrderMapper.selectUserNos(beginDate, endDate);

        //2遍历userNoList

        //文件名称


        for (String userNo : userNoList) {
            List<EachDayBillOrder> orderList = tradeOrderMapper.selectSuccOrderByNo(userNo, beginDate, endDate);

            threadPoolExecutor.execute(() -> {
                //生成 excel 的文件
                String fileName = userNo + "-" + dateFormat + "-bill.xlsx";
                File file = Paths.get(billPath, dateFormat, fileName).toFile();
                EasyExcel.write(file, EachDayHeader.class)
                        .sheet("每日对账单")
                        .doWrite(orderList);//写集合的数据
            });


        }
    }

    /*发送邮件*/

    @XxlJob("sendEachDayBillEmail")
    public void sendEachDayBillEmail() {
        //1获取待发送的用户列表和邮箱

        Date current = new Date();
        //offset 中第一个参数是时间  第二个参数是要操作时间的部分 第三个参数是做加做减的数量值
        Date yesterday = DateUtil.offset(current, DateField.DAY_OF_MONTH, -1);

        //截断
        Date beginDate = DateUtil.truncate(yesterday, DateField.DAY_OF_MONTH);
        Date endDate = DateUtil.truncate(current, DateField.DAY_OF_MONTH);

        List<UserInfo> userInfoList = tradeOrderMapper.selectUserEmail(beginDate, endDate);

        //遍历userInfoList
        //格式化日期
        String fileName = "";
        String dateFormat = new SimpleDateFormat("yyyyMMdd").format(yesterday);
        for (UserInfo userInfo : userInfoList) {
            //从billPath路径找到文件
            fileName = userInfo.getUserNo() + "-" + dateFormat + "-bill.xlsx";
            //完整路径
            File file = Paths.get(billPath, dateFormat, fileName).toFile();

            //创建邮件的数据类 mailProperties
            MailProperties prop = new MailProperties();
            prop.setId(NoUtil.getUUID());
            prop.setFrom(mainFrom);//发送者  这个发送者的值一般放在文件中或者数据库中方便修改
            prop.setTo(new String[]{userInfo.getUserEmail()});
            prop.setSubject("每月的对账订单");
            prop.setText("每月的对账订单");

            //参数是名字 和 文件
            //返回的是带附件的
            AttachFile attachFile = new AttachFile(dateFormat+"对账单",file);

            prop.setAttachFileList(List.of(attachFile));


            mailClient.sendAttachMail(prop);
        }

    }
}
